package Core;

import java.io.InputStream;
import java.util.Hashtable;
import java.util.Vector;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
/**
 *
 * @author Mr Bao
 */
public class ReaderThread implements Runnable {

    private Hashtable utf8 = new Hashtable();
    private boolean isRunning;
    private InputStream in;
    private Vector queue;

    public ReaderThread(InputStream in) {
        this.in = in;
        queue = new Vector();
        InitUTF8();
        isRunning = true;
        new Thread(this).start();
    }

    public void Halt() {
        isRunning = false;
    }

    //<editor-fold defaultstate="collapsed" desc="Tam thoi chua su dung">
//    public void run() {
//        StringBuffer buffer = null;
//        int gcTimer = 0;
//        String newLine;
//        String unicode = "";
//        byte[] buff = null;
//        byte count = 0;
//        int bs;
//        int id = 0;
//        byte testConnection = 0;
//        boolean isLive = false;
//        int timeout = 0;
//        try {
//            while (isRunning) {
//                Thread.sleep(10);
//                gcTimer++;
//                try {
//                    testConnection = in.readByte();
//                } catch (Exception e) {
//                    timeout++;
//                    if (timeout > 2000) {
//                        isRunning = false;
//                        timeout = 0;
//                        break;
//                    }
//                    continue;
//                }
//                timeout = 0;
//                isLive = true;
//                while ((bs = in.available()) > 0) {
//                    buff = new byte[bs];
//                    in.read(buff, 0, buff.length);
//                }
//                for (int i = 0; i < buff.length; i++) {
//                    byte b = buff[i];
//                    if (b != 3) {
//                        if (b != 0) {
//                            if (buffer == null) {
//                                buffer = new StringBuffer();
//                                unicode = "";
//                            }
//                            if (isLive) {
//                                if (testConnection != 3) {
//                                    buffer.append((char) testConnection);
//                                } else if (buffer != null) {
//                                    newLine = buffer.toString();
//                                    if (newLine != null) {
//                                        continue;
//                                    }
//                                    System.out.println(newLine);
//                                    queue.addElement(newLine);
//                                    newLine = null;
//                                    buffer.delete(0, buffer.capacity());
//                                }
//                                isLive = false;
//                            }
//                            if ((int) b < 0) {
//                                count++;
//                                unicode += "" + (int) b;
//                            } else {
//                                if (!unicode.equalsIgnoreCase("")) {
//                                    if (count > 0) {
//                                        if (count <= 3) {
//                                            Object c;
//                                            if ((c = utf8.get(unicode)) != null) {
//                                                buffer.append(c.toString());
//                                            }
//                                        } else {
//                                            id = unicode.indexOf("-", 0);
//                                            id = unicode.indexOf("-", id + 1);
//                                            id = unicode.indexOf("-", id + 1);
//                                            if (id > 0) {
//                                                Object c;
//                                                if ((c = utf8.get(unicode.substring(0, id))) != null) {
//                                                    buffer.append(c.toString());
//                                                }
//                                                if ((c = utf8.get(unicode.substring(id, unicode.length()))) != null) {
//                                                    buffer.append(c.toString());
//                                                }
//                                            }
//                                        }
//                                        unicode = "";
//                                        count = 0;
//                                    }
//                                }
//                                buffer.append((char) b);
//                            }
//                        }
//                    } else {
//                        if (!unicode.equalsIgnoreCase("")) {
//                            if (count > 0) {
//                                if (count <= 3) {
//                                    Object c;
//                                    if ((c = utf8.get(unicode)) != null) {
//                                        buffer.append(c.toString());
//                                    }
//                                } else {
//                                    id = unicode.indexOf("-", 0);
//                                    id = unicode.indexOf("-", id + 1);
//                                    id = unicode.indexOf("-", id + 1);
//                                    if (id > 0) {
//                                        Object c;
//                                        if ((c = utf8.get(unicode.substring(0, id))) != null) {
//                                            buffer.append(c.toString());
//                                        }
//                                        if ((c = utf8.get(unicode.substring(id, unicode.length()))) != null) {
//                                            buffer.append(c.toString());
//                                        }
//                                    }
//                                }
//                                unicode = "";
//                                count = 0;
//                            }
//                        }
//                        newLine = buffer.toString();
//                        if (newLine == null) {
//                            continue;
//                        }
//                        System.out.println(newLine);
//                        queue.addElement(newLine);
//                        newLine = null;
//                        buffer.delete(0, buffer.capacity());
//                        buffer = null;
//                    }
//                }
//                buffer = null;
//            }
//            if (gcTimer == 500) {
//                Runtime.getRuntime().gc();
//                gcTimer = 0;
//            }
//        } catch (Exception e) {
//            isRunning = false;
//        }
//    }
    //</editor-fold>
    public Vector GetQueue() {
        return queue;
    }

    public String GetFirst() {
        if (queue.size() > 0) {
            String message = queue.elementAt(0).toString();
            queue.removeElementAt(0);
            return message;
        }
        return null;
    }

    //<editor-fold defaultstate="collapsed" desc="UTF-8">
    private void InitUTF8() {
        utf8.put("-61-94", "â");
        utf8.put("-61-96", "à");
        utf8.put("-61-95", "á");
        utf8.put("-61-93", "ã");
        utf8.put("-61-86", "ê");
        utf8.put("-61-88", "è");
        utf8.put("-61-87", "é");
        utf8.put("-61-78", "ò");
        utf8.put("-61-77", "ó");
        utf8.put("-61-75", "õ");
        utf8.put("-61-84", "ì");
        utf8.put("-61-83", "í");
        utf8.put("-61-67", "ý");
        utf8.put("-61-71", "ù");
        utf8.put("-61-70", "ú");
        utf8.put("-61-76", "ô");
        utf8.put("-60-111", "đ");
        utf8.put("-60-125", "ă");
        utf8.put("-60-87", "ĩ");
        utf8.put("-59-87", "ũ");
        utf8.put("-58-95", "ơ");
        utf8.put("-58-80", "ư");
        utf8.put("-31-69-127", "ề");
        utf8.put("-31-70-89", "ầ");
        utf8.put("-31-70-91", "ấ");
        utf8.put("-31-70-87", "ẩ");
        utf8.put("-31-70-85", "ẫ");
        utf8.put("-31-70-83", "ậ");
        utf8.put("-31-70-93", "ả");
        utf8.put("-31-70-79", "ằ");
        utf8.put("-31-70-81", "ắ");
        utf8.put("-31-70-77", "ẳ");
        utf8.put("-31-70-75", "ẵ");
        utf8.put("-31-70-73", "ặ");
        utf8.put("-31-70-69", "ẻ");
        utf8.put("-31-70-67", "ẽ");
        utf8.put("-31-70-71", "ẹ");
        utf8.put("-31-70-65", "ế");
        utf8.put("-31-70-95", "ạ");
        utf8.put("-31-69-125", "ể");
        utf8.put("-31-69-123", "ễ");
        utf8.put("-31-69-121", "ệ");
        utf8.put("-31-69-99", "ờ");
        utf8.put("-31-69-101", "ớ");
        utf8.put("-31-69-97", "ở");
        utf8.put("-31-69-95", "ỡ");
        utf8.put("-31-69-93", "ợ");
        utf8.put("-31-69-119", "ỉ");
        utf8.put("-31-69-117", "ị");
        utf8.put("-31-69-77", "ỳ");
        utf8.put("-31-69-73", "ỷ");
        utf8.put("-31-69-71", "ỹ");
        utf8.put("-31-69-75", "ỵ");
        utf8.put("-31-69-85", "ừ");
        utf8.put("-31-69-87", "ứ");
        utf8.put("-31-69-83", "ử");
        utf8.put("-31-69-81", "ữ");
        utf8.put("-31-69-79", "ự");
        utf8.put("-31-69-89", "ủ");
        utf8.put("-31-69-91", "ụ");
        utf8.put("-31-69-113", "ỏ");
        utf8.put("-31-69-115", "ọ");
        utf8.put("-31-69-109", "ồ");
        utf8.put("-31-69-111", "ố");
        utf8.put("-31-69-107", "ổ");
        utf8.put("-31-69-105", "ỗ");
        utf8.put("-31-69-103", "ộ");

        //Upcases
        utf8.put("-61-126", "Â");
        utf8.put("-61-128", "À");
        utf8.put("-61-127", "Á");
        utf8.put("-61-125", "Ã");
        utf8.put("-61-118", "Ê");
        utf8.put("-61-120", "È");
        utf8.put("-61-119", "É");
        utf8.put("-61-110", "Ò");
        utf8.put("-61-109", "Ó");
        utf8.put("-61-107", "Õ");
        utf8.put("-61-116", "Ì");
        utf8.put("-61-115", "Í");
        utf8.put("-61-99", "Ý");
        utf8.put("-61-103", "Ù");
        utf8.put("-61-102", "Ú");
        utf8.put("-61-108", "Ô");
        utf8.put("-60-112", "Đ");
        utf8.put("-60-126", "Ă");
        utf8.put("-60-88", "Ĩ");
        utf8.put("-59-88", "Ũ");
        utf8.put("-58-96", "Ơ");
        utf8.put("-58-81", "Ư");
        utf8.put("-31-69-128", "Ề");

        utf8.put("-31-70-90", "Ầ");
        utf8.put("-31-70-92", "Ấ");
        utf8.put("-31-70-88", "Ẩ");
        utf8.put("-31-70-86", "Ẫ");
        utf8.put("-31-70-84", "Ậ");
        utf8.put("-31-70-94", "Ả");
        utf8.put("-31-70-80", "Ằ");
        utf8.put("-31-70-82", "Ắ");
        utf8.put("-31-70-78", "Ẳ");
        utf8.put("-31-70-76", "Ẵ");
        utf8.put("-31-70-74", "Ặ");
        utf8.put("-31-70-70", "Ẻ");
        utf8.put("-31-70-68", "Ẽ");
        utf8.put("-31-70-72", "Ẹ");
        utf8.put("-31-70-66", "Ế");
        utf8.put("-31-70-96", "Ạ");

        utf8.put("-31-69-126", "Ể");
        utf8.put("-31-69-124", "Ễ");
        utf8.put("-31-69-122", "Ệ");
        utf8.put("-31-69-100", "Ờ");
        utf8.put("-31-69-102", "Ớ");
        utf8.put("-31-69-98", "Ở");
        utf8.put("-31-69-96", "Ỡ");
        utf8.put("-31-69-94", "Ợ");
        utf8.put("-31-69-120", "Ỉ");
        utf8.put("-31-69-118", "Ị");
        utf8.put("-31-69-78", "Ỳ");
        utf8.put("-31-69-74", "Ỷ");
        utf8.put("-31-69-72", "Ỹ");
        utf8.put("-31-69-76", "Ỵ");
        utf8.put("-31-69-86", "Ừ");
        utf8.put("-31-69-88", "Ứ");
        utf8.put("-31-69-84", "Ử");
        utf8.put("-31-69-82", "Ữ");
        utf8.put("-31-69-80", "Ự");
        utf8.put("-31-69-90", "Ủ");
        utf8.put("-31-69-92", "Ụ");
        utf8.put("-31-69-114", "Ỏ");
        utf8.put("-31-69-116", "Ọ");
        utf8.put("-31-69-110", "Ồ");
        utf8.put("-31-69-112", "Ố");
        utf8.put("-31-69-108", "Ổ");
        utf8.put("-31-69-106", "Ỗ");
        utf8.put("-31-69-104", "Ộ");
    }
    //</editor-fold>

    public void run() {
        while (isRunning) {
            try {
                int lenght = in.available();
                if (lenght == 0) {
                    continue;
                }
                byte[] datas = new byte[lenght];
                int count = in.read(datas);
                while (count < lenght) {
                    count += in.read(datas, count, lenght - count);
                }
                String message = new String(datas);
                if (!message.equals("")) {
                    System.out.println(message);
                    queue.addElement(message);
                }
            } catch (Exception e) {
            }
        }
    }
}
